from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed

from utils.myjwt import jwtweb
import jwt
from user.models import UserModel
class MyAuthentication(BaseAuthentication):
    # 定义方法 authentication
    def authenticate(self, request):
        # 获取token的方法  request.MATA.get('HTTP_AUTHORIZATION', None)
        token = request.META.get('HTTP_AUTHORIZATION', None)
        # 如果token存在并正确
        if token:
            # 将token用空格分割只要下表为1的数据 -->Bearer后面有个空格 只要eyjh..........这是token
            # Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiIxNTAzOTI5Njc5NyIsImV4cCI6MTczMjgzNzc2Mn0.2nrNFJJ2z2DFZo0iEK2FmiRFUQyOedxMSQ-F7i0gjzw
            tokendata =token.split(" ")[1]
            try:
                # 可能会报错
                # 结果要解密后的数据 通过-->调用 myjwt里面的 def checktoken 方法 进行解密 传参数 tokendata
                # tokendata 没有被解密过-->eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MywidXNlcm5hbWUiOiIxNTAzOTI5Njc5NyIsImV4cCI6MTczMjg4NzY0M30.SuZcjEoMgZiuN0XzxzryBorgpeZE9PErs4HpA7y_AeA
                rusult = jwtweb.checktoken(tokendata)
                # print(rusult) -->字典   {'id': 3, 'username': '15039296797', 'exp': 1732887643}

                # 获取到用户模型里面id=rusult键为id 的值
                user =UserModel.objects.get(id=rusult["id"])
                # 返回给测试类将数据-->Test APIView的request接收
                return (user,tokendata)
            except jwt.ExpiredSignatureError:
                raise AuthenticationFailed('token过期')
            except jwt.InvalidTokenError:
                raise AuthenticationFailed("token无效")

        # print(token)
        # data = jwtweb.checktoken(token)
        # print(data)